using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;

namespace Ent.Inscripcion.Core
{
    [Serializable]
    public class CatalogoItems : 
      BusinessListBase<CatalogoItems, CatalogoItem>
    {
        #region Factory Methods

        internal static CatalogoItems NewCatalogoItems()
        {
            return DataPortal.CreateChild<CatalogoItems>();
        }

        internal static CatalogoItems GetCatalogoItems(
          object childData)
        {
            return DataPortal.FetchChild<CatalogoItems>(childData);
        }

        private CatalogoItems()
        { }

        #endregion

        #region Data Access

        private void Child_Fetch(Guid childData)
        {
            RaiseListChangedEvents = false;
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", childData), new Parametro("Codigo", "")};

            var datos = accesoDatos.EjecutarReader("ConsultarItem", parametros);
            while (datos.Datos.Read()){
                Add(CatalogoItem.GetCatalogoItem(datos));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class CatalogoItem : BusinessBase<CatalogoItem>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        public static readonly PropertyInfo<Guid> IdCatalogoProperty = RegisterProperty<Guid>(c => c.IdCatalogo);
        /// <Summary>
        /// Gets or sets the IdCatalogoPadre value.
        /// </Summary>
        public Guid IdCatalogo
        {
            get { return GetProperty(IdCatalogoProperty); }
            set { SetProperty(IdCatalogoProperty, value); }
        }

        public static readonly PropertyInfo<string> CodigoProperty = RegisterProperty<string>(c => c.Codigo);
        /// <Summary>
        /// Gets or sets the codigo value.
        /// </Summary>
        public string Codigo
        {
            get { return GetProperty(CodigoProperty); }
            set { SetProperty(CodigoProperty, value); }
        }

        public static readonly PropertyInfo<string> NombreProperty = RegisterProperty<string>(c => c.Nombre);
        /// <Summary>
        /// Gets or sets the nombre value.
        /// </Summary>
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }

        public static readonly PropertyInfo<string> DescripcionProperty = RegisterProperty<string>(c => c.Descripcion);
        /// <Summary>
        /// Gets or sets the Descripcion value.
        /// </Summary>
        public string Descripcion
        {
            get { return GetProperty(DescripcionProperty); }
            set { SetProperty(DescripcionProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion      

        #region Factory Methods

        public static CatalogoItem NewCatalogoItem()
        {
            var item=DataPortal.CreateChild<CatalogoItem>();
            
            return item;
        }

        internal static CatalogoItem GetCatalogoItem(object childData)
        {
            return DataPortal.FetchChild<CatalogoItem>(childData);
        }

        public CatalogoItem()
        {
            
            SetProperty(IdProperty,Guid.NewGuid());
        }

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(Reader childData)
        {
            LoadProperty( IdProperty, Guid.Parse(childData.Datos.GetString(0)));
            LoadProperty(IdCatalogoProperty, Guid.Parse(childData.Datos.GetString(1)));
            LoadProperty(CodigoProperty, childData.Datos.GetString(2));
            LoadProperty(NombreProperty, childData.Datos.GetString(3));
            LoadProperty(DescripcionProperty, childData.Datos.GetString(4));
        }

        private void Child_Insert(Guid parentId)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            
            parametros.Add(new Parametro("Codigo", ReadProperty(CodigoProperty)));
            parametros.Add(new Parametro("Nombre", ReadProperty(NombreProperty)));
            parametros.Add(new Parametro("Descripcion", ReadProperty(DescripcionProperty)));
            parametros.Add(new Parametro("CatalogoId", parentId));
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));

            accesoDatos.EjecutarQuery("InsertarItem", parametros);
        }

        private void Child_Update(Guid parent)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Codigo", ReadProperty(CodigoProperty)));
            parametros.Add(new Parametro("Nombre", ReadProperty(NombreProperty)));
            parametros.Add(new Parametro("Descripcion", ReadProperty(DescripcionProperty)));
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));

            accesoDatos.EjecutarQuery("ActualizarItem", parametros);
        }

        private void Child_DeleteSelf(Guid parent)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));
            accesoDatos.EjecutarQuery("EliminarItem", parametros);
        }

        #endregion
    }
}
